--imports
local WIM = WIM;
local _G = _G;
local pairs = pairs;
local GetTime = GetTime;


--set namespace
setfenv(1, WIM);


------------------------------------------
-- Module: ClickControl (Experimental)	--
------------------------------------------


local ClickControl = WIM.CreateModule("ClickControl", true);

local isInitialized = false;
local buttons = {};
local frame;

db_defaults.ClickControl = {
    clickSensitivity = .2;  
};


local function getButtonDownCount()
    local count = 0;
    for button, tbl in pairs(buttons) do
        if(tbl.mouseDown) then
            count = count + 1;
        end
    end
    return count;
end

local function getButtonTable(button)
    if(buttons[_G.tostring(button)]) then
	return buttons[button];
    else
	buttons[_G.tostring(button)] = {};
	return getButtonTable(button);
    end
end

local function cleanButtonTable(button)
    local tbl = getButtonTable(button);
    for t, _ in pairs(tbl) do
        tbl[t] = nil;
    end
end

local function worldFrameClicked(button)
    dPrint("WorldFrame -> Clicked["..button.."]");
    WIM.CallModuleFunction("OnWorldFrameClick", button);
end


function ClickControl:OnEnable()
    if(not isInitialized) then
    
        _G.WorldFrame:HookScript("OnMouseDown", function(self, button)
            if(ClickControl.enabled) then
                local p = getButtonTable(button);
                p.mouseDown = true;
                p.clickStart = GetTime();
            end
        end);
    
        _G.WorldFrame:HookScript("OnMouseUp", function(self, button)
            if(ClickControl.enabled) then
                local buttonCount = getButtonDownCount(); -- we need to know this cause we don't want to count moving.
                local p = getButtonTable(button);
                p.mouseDown = false;
                p.clickStop = GetTime();
                if(((p.clickStop or 999999999) - (p.clickStart or 0)) < db.ClickControl.clickSensitivity and buttonCount < 2 and not p.move) then
                    worldFrameClicked(button);
                end
                cleanButtonTable(button);
            end
	end);
        
	-- we only want to add hook once.
	isInitialized = true;
    end
end

function ClickControl:OnDisable()
    if(isInitialized) then
    -- alert to reload UI.
        _G.StaticPopupDialogs["WIM_CLICKCONTROL_DISABLE"] = {
        	preferredIndex = STATICPOPUP_NUMDIALOGS,
            text = L["The UI must be reloaded in order to disable this module fully. Reload UI now?"],
            button1 = _G.TEXT(_G.YES),
            button2 = _G.TEXT(_G.NO),
            OnShow = function(self) end,
            OnHide = function() end,
            OnAccept = function() _G.ReloadUI(); end,
            OnCancel = function() end,
            timeout = 0,
            whileDead = 1,
            hideOnEscape = 1
        };        
        _G.StaticPopup_Show ("WIM_CLICKCONTROL_DISABLE", theLink);
    end
end



------------------------------------------
--  Sub Functionality, Editbox Focus    --
------------------------------------------

function ClickControl:OnWorldFrameClick(button)
    if(EditBoxInFocus) then
        local editBox = EditBoxInFocus;
        editBox:Hide();
        editBox:Show();
    end
end
